package com.situ.springboot.controller;

import com.situ.springboot.entity.Dept;
import com.situ.springboot.entity.User;
import com.situ.springboot.mapper.DeptMapper;
import com.situ.springboot.mapper.UserMapper;
import com.situ.springboot.util.JSONResult;
import com.situ.springboot.util.LayUITableResult;
import com.situ.springboot.vo.UserDeptVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpSession;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;

// SSM

@Controller
@RequestMapping("/user")
public class UserController {
    // 要想使用UserMapper需要通过Autowired注入过来
    @Autowired
    private UserMapper userMapper;

    @Autowired
    private DeptMapper deptMapper;

    // http://localhost:8080/user/selectAll
    @RequestMapping("/selectAll")
    public String selectAll(Model model) {
        System.out.println("UserController.selectAll");
        // SELECT `id`,`name`,`age`,`gender` FROM `user`;

        // 使用Mybatis操作数据库，查询出所有的User信息，  封装到ArrayList集合里面
        ArrayList<User> list = userMapper.selectAll();

        for (User user : list) {
            System.out.println(user);
        }

        // 浏览器发一个请求访问后台，通过Mybaits查询数据库，已经将数据查询出来
        // 接下来的操作就是把数据交给jsp页面进行展示

        // 把数据放到内存里面
        model.addAttribute("list", list);
        // 转发到页面进行展示
        return "user_list_back.jsp";
    }

    @RequestMapping("/getUserListPage")
    public String getUserListPage() {
        return "/WEB-INF/jsp/user_list.jsp";
    }

    //  /user/selectByPage?page=1&limit=10
    // page=1默认加载第一页  limit=10每页有多少条数据，默认10条
    @RequestMapping("/selectByPage")
    @ResponseBody  // 返回json格式数据
    public LayUITableResult selectByPage(Integer page, Integer limit) {

        // 查询总的数量
        int count = userMapper.selectTotalCount();
        // 查询当前页数据的集合
        // mysql数据库里面没有分页这个概念，他只有偏移到哪个位置，然后返回后面的多少个
        int offset = (page - 1) * limit;
        ArrayList<UserDeptVO> list = userMapper.selectByPage(offset, limit);

        return LayUITableResult.ok(count, list);
    }

    // http://localhost:8080/user/deleteById?id=1
//    @RequestMapping("/deleteById")
//    public String deleteById(Integer id) {
//        System.out.println("id: " + id);
//        userMapper.deleteById(id);
//
//        // 删除完之后，重定向到查找所有界面，展示最新数据
//        return "redirect:/user/selectAll";
//    }

    @RequestMapping("/deleteById")
    @ResponseBody
    public JSONResult deleteById(Integer id){
        System.out.println("id: " + id);
        userMapper.deleteById(id);

        return JSONResult.ok("删除成功");
    }

    // ids: 30,31
    @RequestMapping("/deleteAll")
    @ResponseBody
    public JSONResult deleteAll(@RequestParam(value = "ids[]") Integer[] ids){
        System.out.println("ids: " + Arrays.toString(ids));
        for (Integer id : ids) {
            userMapper.deleteById(id);
        }

        return JSONResult.ok("删除成功");
    }

    @RequestMapping("/getUserInsertPage")
    public String getUserInsertPage(Model model) {
        ArrayList<Dept> deptList = deptMapper.selectAll();
        model.addAttribute("deptList", deptList);
        // 转发到添加页面
        return "/WEB-INF/jsp/user_insert.jsp";
    }

    // Springmvc会自动封装成User对象，这个user对象里面是没有id的，因为没有插入过数据库
    @RequestMapping("/insert")
    @ResponseBody
    public JSONResult insert(User user) {
        System.out.println(user);

        userMapper.insert(user);

        // 删除完之后，重定向到查找所有界面，展示最新数据
        // return "redirect:/user/selectAll";

        return  JSONResult.ok("插入成功");
    }

    @RequestMapping("/getUserUpdatePage")
    public String getUserUpdatePage(Integer id, Model model) {
        // 转发到user_update.jsp的时候要展示出这个User的所有信息，
        // 所以要根据id把User的信息查询出来
        User user = userMapper.selectById(id);
        ArrayList<Dept> deptList = deptMapper.selectAll();
        // 把查出来要修改的User对象放到内存里面
        model.addAttribute("user", user);
        model.addAttribute("deptList", deptList);
        // 转发到修改界面
        return  "/WEB-INF/jsp/user_update.jsp";
    }

    @RequestMapping("/update")
    @ResponseBody
    public JSONResult update(User user) {
        System.out.println(user);

        userMapper.update(user);

        return  JSONResult.ok("修改成功");
    }

    @RequestMapping("/getLoginPage")
    public String getLoginPage() {
        return  "/WEB-INF/jsp/login.jsp";
    }

    @RequestMapping("/login")
    @ResponseBody
    public JSONResult login(String name, String password, String authCode, HttpSession session) {
        // 首先验证验证码对不对
        // 1、如果验证码不对，就没有必要验证用户名和密码对不对
        // 2、如果验证码对，那么再去验证用户名和密码
        String authCodeSession = (String) session.getAttribute("authCodeSession");
        // 后台生成的验证码和用户输入的验证码进行比较
        if (!authCodeSession.equals(authCode)) {
            return JSONResult.error("验证码不匹配");
        }

        User user = userMapper.login(name, password);
        if (user != null) {// 登录成功，查找到了符合这个用户名和密码的用户
            // 用户的登陆信息放到Session里面
            session.setAttribute("user", user);
            return JSONResult.ok("登录成功");
        } else {
            return  JSONResult.error("登录失败");
        }
    }

    @RequestMapping("/logout")
    public String logout(HttpSession session) {
        // 销毁Session，用户的登录凭证就没有了
        session.invalidate();
        // 注销了之后，应该跳转到登录界面
        return "redirect:/user/getLoginPage";
    }

    public static void main(String[] args) {
        User user1 = new User();
        user1.setId(1);
        user1.setName("张三");
        user1.setAge(23);
        user1.setGender("男");

        User user2 = new User();
        user2.setId(2);
        user2.setName("张三2");
        user2.setAge(23);
        user2.setGender("男");

        // <User>代表集合里面放的什么东西
        // ArrayList的本质就是一个数组
        ArrayList<User> list = new ArrayList<>();
        list.add(user1);
        list.add(user2);

        for (User user : list) {
            System.out.println(user);
        }

    }
}
